---
sidebar_position: 1
---

# 1. Основные определения STL

Библиотека стандартных шаблонов (Standard Template Library, STL) - наиболее совершенный инструмент языка программирования С++.
Ядро библиотеки стандартных шаблонов состоит из четырех основных элементов:

- контейнеров,
- итераторов,
- алгоритмов,
- функциональных объектов.

**Контейнеры** - это объекты, предназначенные для хранения других объектов. Контейнеры бывают различных типов: массивы, очереди, списки и т. д.

**Алгоритмы** - выполняют операции над содержимым контейнеров. Существуют алгоритмы для инициализации, сортировки, поиска или замены содержимого контейнеров.

**Итераторы** - это объекты, которые по отношению к контейнерам играют роль указателей. Они позволяют получать доступ к содержимому контейнера так, как указатель позволяет получать доступ к элементу массива.

**Функциональные объекты** - это объекты, действующие как функции. Они могут быть объектами класса или указателями на функции, включающими в себя имя функции, поскольку именно оно работает как указатель.

Основные контейнеры, определенные в SТL, представлены далее:

| Контейнер | Описание | Заголовок |
| --- | --- | --- |
| `bitset` | Множество битов | `<bitset>` |
| `deque` | Двунаправленный список | `<deque>` |
| `list` | Линейный список | `<list>` |
| `map` | Ассоциативный список для хранения пар ключ/значение, где с каждым ключом связано только одно значение | `<map>` |
| `multimap` | Ассоциативный список для хранения пар ключ/значение, где с каждым ключом связано два или более значений | `<map>` |
| `multiset` | Множество, в котором каждый элемент не обязательно уникален | `<set>` |
| `priority_queue` | Очередь с приоритетом | `<queue>` |
| `queue` | Очередь | `<queue>` |
| `set` | Множество, в котором каждый элемент уникален | `<set>` |
| `stack` | Стек | `<stack>` |
| `vector` | Динамический массив | `<vector>` |

Методы, общие для всех контейнеров:

| Имя | Назначение |
| --- | --- |
| `size()` | Возвращает число элементов в контейнере |
| `empty()` | Возвращает `true`, если контейнер пуст |
| `max_size()` | Возвращает максимально допустимый размер контейнера |
| `begin()` | Возвращает итератор на начало контейнера |
| `end()` | Возвращает итератор на конец контейнера |
| `rbegin()` | Возвращает реверсивный итератор на конец контейнера (итерации происходят в обратном направлении) |
| `rend()` | Возвращает реверсивный итератор на начало контейнера (итерации происходят в обратном направлении) |

Алгоритмы предназначены для обработки контейнеров. Каждый контейнер имеет собственный базовый набор операций, но стандартные алгоритмы обеспечивают более широкий спектр действий. Кроме того, они позволяют одновременно работать с двумя контейнерами, имеющими разные типы. Для обеспечения доступа к алгоритмам SТL, нужно подключить заголовочный файл `<algorithm>`.

Основные алгоритмы STL приведены далее:

| Алгоритм | Действие |
| --- | --- |
| `find` | Возвращает первый элемент с указанным значением |
| `count` | Считает количество элементов, имеющих указанное значение |
| `equal` | Сравнивает содержимое двух контейнеров и возвращает `true`, если все соответствующие элементы эквивалентны |
| `search` | Ищет последовательность, значений в одном контейнере, которая соответствует такой же последовательности в другом |
| `copy` | Копирует последовательность, значений из одного контейнера в другой или в другое место того же контейнера |
| `swap` | Обменивает значения, хранящиеся в разных местах |
| `sort` | Сортирует значения в указанном порядке |
| `merge` | Комбинирует два сортированных диапазона значений для получения возможно большего диапазона |
| `accumulate` | Возвращает сумму элементов в заданном диапазоне |
| `for_each` | Выполняет указанную функцию для каждого элемента контейнера |
| `reverse` | Меняет на обратный порядок расположения элементов в контейнере |
